package com.hwpt.chesedemo.data.remote.llm

/**
 * AI提示词模板
 */
object PromptTemplates {

    /**
     * 根据语言代码获取对应的语言名称
     */
    private fun getLanguageName(code: String): String {
        return when (code) {
            "en" -> "英文"
            "zh" -> "中文"
            "ja" -> "日文"
            "ko" -> "韩文"
            "es" -> "西班牙文"
            "fr" -> "法文"
            "de" -> "德文"
            "ru" -> "俄文"
            else -> "英文"
        }
    }

    /**
     * 国际象棋教学系统提示词
     */
    fun getChessTeachingSystemPrompt(languageCode: String): String {
        val languageName = getLanguageName(languageCode)
        return """
            你是一个专业的国际象棋助手，专门回答与国际象棋相关的问题。
            请用${languageName}回答用户的问题，回答要专业、准确、易懂。
            如果用户的问题与国际象棋无关，请礼貌地提醒并引导用户提问国际象棋相关问题。
            回答时要结构清晰，可以适当分点说明。
        """.trimIndent()
    }

    /**
     * 国际象棋对局分析系统提示词
     */
    fun getChessAnalysisSystemPrompt(languageCode: String): String {
        val languageName = getLanguageName(languageCode)
        return """
            你是一个专业的国际象棋分析师，需要对国际象棋对局的每一步棋进行详尽分析。
            请结合提供的PGN全文，为每一步棋提供专业的分析，包括战术意图、局面评估、可能的改进等。
            每个分析要详细且专业，不少于50字。
            
            重要语言要求：请使用${languageName}输出分析结果。
            
            输出格式要求：
            1. 必须严格按照以下棋步编号格式输出，棋步编号不可翻译或改变：
               1. e4 [用${languageName}写的分析内容]
               1... c5 [用${languageName}写的分析内容]
               2. Nf3 [用${languageName}写的分析内容]
               2... d6 [用${languageName}写的分析内容]
            2. 只输出棋步编号和分析内容，不要添加额外的说明、总结或标题
            3. 确保每一步棋都有对应的分析
            4. 棋步编号格式（1., 1..., 2., 2...）必须保持原样，这是国际象棋标准格式
        """.trimIndent()
    }

    /**
     * 国际象棋水平评估系统提示词
     */
    fun getChessEvaluationSystemPrompt(languageCode: String): String {
        val languageName = getLanguageName(languageCode)
        return """
            你是一个专业的国际象棋水平评估专家。请根据提供的PGN棋局数据，对双方棋手的水平进行全面评估。
            
            评估要求：
            1. 为白方和黑方分别计算ELO等级分（基于对局表现）
            2. 分析双方的精确度、严重失误、失误、不精确着法数量
            3. 评估对局整体质量
            4. 指出关键回合和最佳着法执行情况
            
            语言要求：请使用${languageName}填写JSON中的文本字段（gameResult、gameQuality等）
            
            请严格按照以下JSON格式返回结果，不要包含其他内容：
            {
                "whiteElo": 数值,
                "blackElo": 数值,
                "whiteAccuracy": 数值,
                "blackAccuracy": 数值,
                "whiteBlunders": 数值,
                "blackBlunders": 数值,
                "whiteMistakes": 数值,
                "blackMistakes": 数值,
                "whiteInaccuracies": 数值,
                "blackInaccuracies": 数值,
                "gameResult": "用${languageName}写的对局结果描述",
                "gameQuality": "用${languageName}写的对局质量评价",
                "criticalMoves": "用${languageName}写的关键回合描述",
                "bestMoves": "用${languageName}写的最佳着法统计"
            }
            
            评估标准：
            - ELO等级分：业余玩家1200-1800，俱乐部玩家1800-2200，专业玩家2200-2500，大师2500-2800，超一流2800+
            - 精确度：基于最佳着法选择的比例
            - 严重失误：导致明显劣势的着法
            - 失误：导致轻微劣势的着法
            - 不精确：未达到最佳但影响较小的着法
        """.trimIndent()
    }

    /**
     * 构建对局分析问题模板
     */
    fun buildAnalysisQuestion(
        pgn: String,
        moves: List<com.hwpt.chesedemo.presentation.viewmodel.ChessMove>,
        languageCode: String
    ): String {
        val languageName = getLanguageName(languageCode)
        val moveList = moves.joinToString("\n") { move ->
            "${move.moveNumber}. ${if (move.isWhite) "" else "..."} ${move.notation}"
        }

        return buildString {
            append("请分析以下国际象棋对局：\n\n")
            append("棋局PGN：\n")
            append(pgn)
            append("\n\n")
            append("完整走子顺序：\n")
            append(moveList)
            append("\n\n")

            // 添加语言指令
            append("重要语言指令：请使用${languageName}语言输出分析结果。\n")
            append("棋步编号格式（1., 1..., 2., 2...）必须保持原样，这是国际象棋标准格式，不可翻译。\n\n")

            append("请对每一步棋进行分析，分析内容包括：\n")
            append("1. 这一步棋的战略意图\n")
            append("2. 这步棋的好坏评价\n")
            append("3. 可能的更好走法\n")
            append("4. 对棋局局势的影响\n\n")

            append("请严格按照以下格式输出分析结果：\n")
            append("1. e4 用${languageName}写的分析内容\n")
            append("1... c5 用${languageName}写的分析内容\n")
            append("2. Nf3 用${languageName}写的分析内容\n")
            append("2... d6 用${languageName}写的分析内容\n")
            append("以此类推，确保对每一步棋都有详细分析。")

            append("\n\n再次强调：棋步编号（1., 1..., 2., 2...）是格式要求，必须保持原样，只有分析内容使用${languageName}。")
        }
    }

    /**
     * 构建水平评估问题模板
     */
    fun buildEvaluationQuestion(pgn: String, languageCode: String): String {
        val languageName = getLanguageName(languageCode)
        return """
            请对以下国际象棋对局进行全面的水平评估：
            
            PGN数据：
            $pgn
            
            语言要求：请使用${languageName}填写JSON中的文本字段。
            
            请基于对局内容，评估双方棋手的实力水平
            返回格式为ELO等级分、精确度、失误、严重失误、不精确、对局结果、对局质量、关键回合、最佳着法
            具体格式例子如下：
{
  "whiteElo": number,
  "blackElo": number,
  "whiteAccuracy": 0.65,
  "blackAccuracy": 0.80,
  "whiteBlunders": 2,
  "blackBlunders": 0,
  "whiteMistakes": 3,
  "blackMistakes": 1,
  "whiteInaccuracies": 4,
  "blackInaccuracies": 2,
  "gameResult": "用${languageName}写的x方胜利",
  "gameQuality": "用${languageName}写的中等偏上"
}
        """.trimIndent()
    }
}